#include<stdio.h>

//位运算符 <<,>>,~,|,^,& 依次是左移，右移，按位取反，按位或，按位异或，按位与
//位运算只能用于对整型数据进行操作
int main() {
    short i = 5;//short是整型，是2个字节的整型，int是4个字节
    short j;
//    j = i << 1;//一个变量移动以后自身不会发生变化
//    printf("j=%d\n", j);//左移是乘2，结果为10
//    j = i >> 1;
//    printf("j=%d\n", j);//左移是除2，结果为10
    i = 0x8011;
    unsigned short s = 0x8011;//在short前加unsigned表示无符号数，无符号数只能是正数或者0
    unsigned short r = 0;
    j = i >> 1;//对有符号数进行右移
    r = s >> 1;//对无符号数进行右移
    printf("j=%d,r=%u\n", j, r);//结果是不一样的

    //接下来看 按位与，按位或，按位异或，按位取反
    /**
     * 5：0101
     * 7：0111
     * 按位与：如果两个相应的二进制位都为1，则该位的结果值为1，否则为0
     * 0 & 0 = 0,0 & 1 = 0,1 & 1 = 1
     * 按位或:两个对应的二进制位中只要有一个为1，该位的结果值为1
     * 0 | 0 = 0,0 | 1 = 1,1 | 0 = 1,1 | 1 = 1
     * 异或：相同为0，不同为1
     * 0 ^ 0 = 0,0 ^ 1 = 1,1 ^ 0 = 1,1 ^ 1 = 0
     * 按位取反：将0变1，将1变0
     *!注意：~运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他位运算符都高
     * */
    i = 5, j = 7;
    printf("i&j=%d\n", i & j);
    printf("i|j=%d\n", i | j);
    printf("i^j=%d\n", i ^ j);
    printf("~i=%d", ~i);

    //异或运算符的两个特性：
    /**
     * 1.任何数和0异或得到的是自身
     * 2.两个相等的数一会得到的是0
     * */




    return 0;
}
